package com.brillilab.service.core.user;

import com.brillilab.common.entity.PageVo;
import com.brillilab.domain.enums.lab.InviteCodeTypeEnum;
import com.brillilab.domain.po.user.InviteCode;
import com.brillilab.domain.po.user.Users;
import com.brillilab.domain.vo.user.InviteCodeResult;
import com.brillilab.domain.vo.user.UserInfoVo;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 注册邀请码 服务类
 * </p>
 *
 * @author WuMenghao
 * @since 2019-09-30
 */
public interface IInviteCodeService {

    /**
     * 获取注册邀请码
     *
     * @param type     使用途径
     * @param num      生产数量
     * @param userInfo 用户信息
     * @return
     */
    List<String> generateInviteCodes(String type, Integer num, UserInfoVo userInfo);

    /**
     * 获取注册邀请码2
     *
     * @param type
     * @param num
     * @param makeName
     * @return
     */
    List<String> generateInviteCode(String type, Integer num, String makeName);

    /**
     * 生成邀请码
     * @param type
     * @param num
     * @param userInfo
     * @param expireDate
     * @return
     */
    List<String> generateInviteCode(String type, Integer num, Users userInfo, Date expireDate);

    /**
     * 生成邀请码
     * @param type
     * @param num
     * @param labId
     * @param userInfo
     * @param expireDate
     * @return
     */
    List<String> generateInviteCode(String type, Integer num, Long labId,Users userInfo, Date expireDate);

    /**
     * 校验注邀请码
     *
     * @param code
     * @return
     */
    InviteCodeResult validateInviteCode(String code);

    /**
     * 更新邀请码信息
     *
     * @param inviteCode
     * @return
     */
    boolean updateById(InviteCode inviteCode);

    /**
     * 检测邀请码是否有效
     *
     * @param code
     * @return
     */
    boolean checkInviteCode(String code);

    /**
     * 查询实验室PI分享邀请码
     *
     * @param labId
     * @param typeEnum
     * @return
     */
    InviteCode getLabShareInviteCode(Long labId, InviteCodeTypeEnum typeEnum);

    /**
     * 根据实验室ID获取邀请码
     *
     * @param labId
     * @return
     */
    List<InviteCode> getInviteCodeInfo(Long labId);

    /**
     * 根据实验室ID和生成时间获取邀请码
     *
     * @param labId
     * @param makeTime
     * @return
     */
    List<InviteCode> getInviteCodeByMakeTime(Long labId, Date makeTime);

    /**
     * 获取邀请码信息
     *
     * @param code
     * @return
     */
    InviteCode getInviteCodeByCode(String code);

    /**
     * 根据条件获取邀请码列表
     *
     * @param useType  使用途径
     * @param makeName 生成人
     * @param isDesc   是否按生成时间降序（0否，1是）
     * @param pageNum  页码
     * @param pageSize 每页条数
     * @return
     */
    PageVo<InviteCode> selectByCondition(String useType, String makeName, Integer isDesc, int pageNum, int pageSize);

    /**
     * 获取使用途径列表
     *
     * @return
     */
    List<String> getUseTypeList();

    /**
     * 获取生成人列表
     *
     * @return
     */
    List<String> getMakeNameList();
}
